package es.ull.etsii.aa.datos;

import java.math.BigDecimal;

public class Nodo {

	public static final int VEHICULO_COMPLETO = 0;
	public static final int SOLO_CAMION = 1;

	private int demanda = 0;
	private int id = 0;
	private int tipo = VEHICULO_COMPLETO;
	private int x = 0;
	private int y = 0;

	/**
	 * Constructor dadas las coordenadas del nodo.
	 * 
	 * @param x
	 *            Coordenada x del nodo.
	 * @param y
	 *            Coordenada y del nodo.
	 */
	public Nodo(int x, int y) {
		this.x = x;
		this.y = y;
	}

	/**
	 * Constructor dados los datos del nodo.
	 * 
	 * @param id
	 *            Identificador del nodo.
	 * @param x
	 *            Coordenada x del nodo.
	 * @param y
	 *            Coordenada y del nodo.
	 * @param demanda
	 *            Demanda del nodo.
	 * @param tipo
	 *            Tipo del nodo (0 - Vehiculo completo, 1 - Solo camion).
	 */
	public Nodo(int id, int x, int y, int demanda, int tipo) {
		this.id = id;

		this.x = x;
		this.y = y;

		this.demanda = demanda;
		this.tipo = tipo;
	}

	/**
	 * Obtiene la demanda de un nodo.
	 * 
	 * @return Demanda del nodo.
	 */
	public int getDemanda() {
		return demanda;
	}

	/**
	 * Obtiene el identificador de un nodo.
	 * 
	 * @return Identificador del nodo.
	 */
	public int getId() {
		return id;
	}

	/**
	 * Obtiene el tipo de un nodo.
	 * 
	 * @return Tipo del nodo.
	 */
	public int getTipo() {
		return tipo;
	}

	/**
	 * Obtiene la coordenada x de un nodo.
	 * 
	 * @return Coordenada x del nodo.
	 */
	public int getX() {
		return x;
	}

	/**
	 * Obtiene la coordenada y de un nodo.
	 * 
	 * @return Coordenada y del nodo.
	 */
	public int getY() {
		return y;
	}

	/**
	 * Calcula la distancia euclidea entre un nodo y este nodo.
	 * 
	 * @param n
	 *            Nodo a comparar.
	 * @return Distancia euclidea entre nodos.
	 */
	public BigDecimal distanciaEuclidea(Nodo n) {
		int xDiff = Math.abs(this.x - n.x);
		int yDiff = Math.abs(this.y - n.y);

		BigDecimal ret = new BigDecimal(Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2)));
		
		return ret.setScale(5, BigDecimal.ROUND_HALF_EVEN);
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();

		sb.append(this.getClass().getSimpleName());
		sb.append("(id = " + id);
		sb.append(", x = " + x);
		sb.append(", y = " + y);

		if (id != 0) {
			sb.append(", demanda = " + demanda);
			
			switch (tipo) {
			case Nodo.VEHICULO_COMPLETO:
				sb.append(", tipo = VEHICULO_COMPLETO");
				break;
			case Nodo.SOLO_CAMION:
				sb.append(", tipo = SOLO_CAMION");
				break;
			default:
				sb.append(", tipo = DESCONOCIDO");
				break;
			}
		}
		
		sb.append(")");

		return sb.toString();
	}
	
	@Override
	public boolean equals(Object o) {
		if (o == null)
			return false;
		
		if (o == this)
			return true;
		
		if (!(o instanceof Nodo))
			return false;
		
		Nodo n = (Nodo) o;
		
		if (id != n.id)
			return false;
		
		return true;
	}
	
}
